]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dnd: Make DND translation-property-aware
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Wed, 22 Jan 2020 08:40:50 +0000 (16:40 +0800)
committerFlorian Müllner <florian.muellner@gmail.com>
Fri, 7 Feb 2020 14:43:56 +0000 (14:43 +0000)
Previously DND only worked properly for actors with zero translation.
But it only requires a small tweak to `this._dragOffsetX/Y` to support
non-zero translation values.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/936

js/ui/dnd.js

index cc2f360b5f9cd38dbcc1fa2ba76dd98dc5dc54fd..cb72737f1c118174665e33555393b3145dd69874 100644 (file)
@@ -411,14 +411,18 @@ var _Draggable = class _Draggable {
         this._snapBackY = this._dragStartY + this._dragOffsetY;
         this._snapBackScale = this._dragActor.scale_x;
 
+        let origDragOffsetX = this._dragOffsetX;
+        let origDragOffsetY = this._dragOffsetY;
+        let [transX, transY] = this._dragActor.get_translation();
+        this._dragOffsetX -= transX;
+        this._dragOffsetY -= transY;
+
         if (this._dragActorMaxSize != undefined) {
             let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size();
             let currentSize = Math.max(scaledWidth, scaledHeight);
             if (currentSize > this._dragActorMaxSize) {
                 let scale = this._dragActorMaxSize / currentSize;
                 let origScale =  this._dragActor.scale_x;
-                let origDragOffsetX = this._dragOffsetX;
-                let origDragOffsetY = this._dragOffsetY;
 
                 // The position of the actor changes as we scale
                 // around the drag position, but we can't just tween
@@ -435,8 +439,8 @@ var _Draggable = class _Draggable {
 
                 this._dragActor.get_transition('scale-x').connect('new-frame', () => {
                     let currentScale = this._dragActor.scale_x / origScale;
-                    this._dragOffsetX = currentScale * origDragOffsetX;
-                    this._dragOffsetY = currentScale * origDragOffsetY;
+                    this._dragOffsetX = currentScale * origDragOffsetX - transX;
+                    this._dragOffsetY = currentScale * origDragOffsetY - transY;
                     this._dragActor.set_position(
                         this._dragX + this._dragOffsetX,
                         this._dragY + this._dragOffsetY);